package com.qimingyu.linkedlist.singlylinkedlist;

import org.w3c.dom.Node;

public class SinglyLinkedList {
    private Node head = null;//头指针

    private static class Node {//用内部类的形式
        int value;//结点的值
        Node next;//next指针

        public Node(int value, Node next) {
            this.value = value;
            this.next = next;
        }
    }

    //实现头插法
    public void addFirst(int value) {
//        //1 链表为空只有一个头结点
//        /*
//        创建一个新的结点，新的结点只有一个值，但是指向空
//        头插法，直接把头结点指向这个新节点就行
//        */
//        head = new Node(value, null);
        //2 链表不为空
        /*
         * 先让新结点的指针指向头结点指向的结点
         * 然后让头结点指向新的结点
         *
         * 实际上可以只用第二种方式，因为链表为空时head也为空
         * */
        head = new Node(value, head);
    }

    //链表的循环遍历
    public void loopPrint() {
        //创建一个指针指向头结点指向的结点，即为链表中的第一个结点
        Node p = head;
        while (p != null) {
            System.out.println(p.value);
            p = p.next;
        }
    }
    public void addTail(int value){
        //如果链表为空，直接插入到头结点的后面
        if (head == null){
            head = new Node(value,null);
            return;
        }

        //如果链表不为空插入到当前链表的末尾
        Node p = head;
        while (p.next != null) {
            p = p.next;
        }
        p.next = new Node(value,null);
    }

    //清空链表
    public void cleanList(){
        head = null;
    }
}